package com.air.controller.airline;


import com.air.dto.TicketDTO;
import com.air.dto.TicketPageQueryDTO;
import com.air.entity.Ticket;
import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.TicketService;
import com.air.vo.TicketVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * 机票相关接口控制器
 * 该控制器负责处理与机票相关的HTTP请求，包括查询、预订等操作。
 * 使用@RestController注解标记，表明这是一个REST风格的控制器，会自动将返回的数据转换为JSON格式响应。
 * 请求的基路径通过@RequestMapping("/airline/ticket")设置为/airline/ticket。
 * Slf4j日志框架被用来记录日志，有助于跟踪控制器中的操作和错误。
 * 同时，使用@Api(tags = "机票相关接口")标记，便于Swagger等API文档工具识别和分类。
 */
@RestController
@RequestMapping("/airline/ticket")
@Slf4j
@Api(tags = "机票相关接口")
public class TicketController {

    @Autowired
    private TicketService ticketService; // 注入TicketService


    /**
     * 添加机票信息的接口。
     * 通过该接口，可以将机票的详细信息添加到系统中。
     * 使用@RequestBody注解指示Spring Boot将HTTP请求体中的数据绑定到ticketDTO对象。
     * 使用@ApiOperation注解描述该接口的操作，方便API文档的生成。
     *
     * @param ticketDTO 机票数据传输对象，包含机票的所有相关信息。
     * @return 返回操作结果，如果保存成功，则返回一个表示成功的Result对象。
     */
    @PostMapping
    @ApiOperation("添加机票")
    public Result save(@RequestBody TicketDTO ticketDTO) {
        // 记录添加的机票信息到日志，以便于问题追踪和审计。
        log.info("添加机票:{}",ticketDTO);
        // 调用机票服务层的方法，实际保存机票信息。
        ticketService.save(ticketDTO);
        // 返回操作结果，表示机票信息保存成功。
        return Result.success();
    }

    /**
     * 分页查询机票信息接口。
     * 使用GET方法，通过传入TicketPageQueryDTO对象来指定查询条件，实现机票信息的分页查询。
     * 返回Result对象，其中包含查询结果的PageResult对象。
     *
     * @param ticketPageQuery 分页查询条件的DTO（数据传输对象），包含页码、每页数量等信息以及查询过滤条件。
     * @return Result对象，包装了查询结果的PageResult对象，包括机票信息列表和分页信息。
     */
    @GetMapping("/page")
    @ApiOperation("分页查询机票")
    public Result<PageResult> pageQuery(TicketPageQueryDTO ticketPageQuery) {
        // 记录查询操作的日志，包括查询条件。
        log.info("分页查询机票:{}",ticketPageQuery);
        // 调用ticketService的pageQuery方法，根据查询条件执行分页查询。
        PageResult pageResult = ticketService.pageQuery(ticketPageQuery);
        // 返回查询结果，包装在Result对象中。
        return Result.success(pageResult);
    }



    /**
     * 批量删除机票接口。
     * 通过接收一个机票ID列表，调用机票服务的批量删除功能。
     *
     * @param ids 机票ID列表，用于指定需要删除的机票。
     * @return 返回操作结果，成功则返回一个表示操作成功的Result对象。
     */
    @DeleteMapping
    @ApiOperation("批量删除机票")
    public Result delete(@RequestParam List<Long> ids) {
        // 记录删除操作的机票ID列表，用于日志记录。
        log.info("批量删除机票:{}", ids);
        // 调用机票服务的批量删除方法，执行删除操作。
        ticketService.deleteBatch(ids);
        // 返回操作成功的结果，表示批量删除操作已执行完毕。
        return Result.success();
    }


    /**
     * 根据机票ID查询详细的机票信息。
     *
     * 本方法通过GET请求方式，结合Spring MVC的@PathVariable注解，从URL路径中提取机票ID，
     * 并以此查询机票服务中相应的机票信息。使用@ApiOperation注解对API进行说明，方便API文档的生成。
     *
     * @param id 机票的唯一标识ID，通过@PathVariable注解绑定到方法参数，从URL路径中获取。
     * @return 返回一个Result对象，其中包含查询到的TicketVO对象。如果未查询到相关机票，则TicketVO可能为null。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询机票")
    public Result<TicketVO> getById(@PathVariable Long id) {
        // 记录查询操作的日志信息。
        log.info("根据id查询机票:{}", id);
        // 调用机票服务，根据ID查询机票信息。
        TicketVO ticketVO = ticketService.getById(id);
        // 将查询结果包装在Result对象中返回。
        return Result.success(ticketVO);
    }


    /**
     * 修改机票信息
     *
     * 该方法通过PUT请求对机票信息进行更新。接收一个TicketDTO对象作为请求体，
     * 其中包含了需要更新的机票的所有相关信息。调用ticketService的update方法来实际执行更新操作。
     *
     * @param ticketDTO 包含待更新机票信息的数据传输对象
     * @return 返回一个Result对象，表示操作的结果。如果操作成功，Result对象将包含成功的标志。
     */
    @PutMapping
    @ApiOperation("修改机票")
    public Result update(@RequestBody TicketDTO ticketDTO) {
        // 记录日志，用于跟踪和调试
        log.info("修改机票:{}",ticketDTO);
        // 调用服务层方法进行机票信息的更新
        ticketService.update(ticketDTO);
        // 返回操作成功的结果
        return Result.success();
    }


    /**
     * 修改机票的状态，可以是启动或停止机票的销售。
     * 使用@PathVariable从URL中提取状态状态和机票ID。
     * 调用ticketService的startOrStop方法来实际执行状态修改。
     * @param status 机票的新状态，表示启动或停止销售。
     * @param id 机票的唯一标识符。
     * @return 返回一个表示操作结果的成功对象。
     */
    @PostMapping("/status/{status}")
    @ApiOperation("修改机票状态")
    public Result startOrStop(@PathVariable Integer status, Long id) {
        // 记录修改机票状态的操作信息。
        log.info("修改机票状态:{},{}",status,id);
        // 调用服务层方法来实际修改机票状态。
        ticketService.startOrStop(status,id);
        // 返回操作成功的结果。
        return Result.success();
    }


    /**
     * 根据航班ID查询机票列表
     *
     * 本接口提供根据航班ID查询相应机票信息的功能。通过指定的航班ID，可以从数据库中检索出与该航班相关的机票列表。
     *
     * @param flightId 航班ID，用于指定要查询的航班
     * @return 包含查询结果的机票列表。如果查询成功，列表将包含与指定航班ID相关的所有机票信息；如果查询失败，列表可能为空。
     */
    @GetMapping("/list")
    @ApiOperation("根据航班id查询机票")
    public Result<List<Ticket>> list(Long flightId){
        // 调用ticketService的服务方法，查询指定flightId的机票列表
        List<Ticket> list = ticketService.list(flightId);
        // 将查询结果包装在Result对象中返回，表示操作成功
        return Result.success(list);
    }
}
